package server;

import java.io.IOException;
import java.io.ByteArrayOutputStream ;
import java.io.ObjectOutputStream ;
import java.io.Serializable ;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.rmi.RemoteException;

import javax.vecmath.Quat4d ;
import javax.vecmath.Vector3d ;

public class BroadcastUpdates implements Serializable {

	private static final long serialVersionUID = 1L;
	private int portDiffusion ;
	private String nomGroupe ;
	public String getNomGroupe () {
		return nomGroupe ;
	}

	private InetAddress adresseDiffusion ;
	private transient MulticastSocket socketDiffusion ;

	private static BroadcastUpdates sharedInstance;
	
	public static BroadcastUpdates getSharedInstance() throws RemoteException{
		if (sharedInstance == null) {
			sharedInstance = new BroadcastUpdates(Server.broadcastAdress,Server.port);
		}
		return sharedInstance;
	}
	
	private BroadcastUpdates (final String ng, final int portDiffusion) throws RemoteException {
		this.portDiffusion = portDiffusion ;
		nomGroupe = ng ;
		System.out.println ("Diffuseur sur le port " + portDiffusion +
				" a destination du groupe " + nomGroupe) ;
		adresseDiffusion = null ;
		socketDiffusion = null ;
		try {
			adresseDiffusion = InetAddress.getByName (nomGroupe) ;
			socketDiffusion = new MulticastSocket () ;
			socketDiffusion.setTimeToLive (64) ;
			socketDiffusion.setLoopbackMode (false) ;
		} catch (IOException e) {
			e.printStackTrace () ;
		}
		System.out.println ("socket : " + socketDiffusion.getLocalPort() + " " + socketDiffusion.getInetAddress ()) ;
	}

	public void diffuseMessage (String name, Vector3d pos, Quat4d quat, String fileLoaded) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream () ;
		ObjectOutputStream oos ;
		try {
			oos = new ObjectOutputStream (baos) ;
			oos.writeObject (name) ;
			oos.writeObject (pos) ;
			oos.writeObject (quat) ;
			oos.writeObject (fileLoaded);
			oos.flush () ;
		} catch (IOException e) {
			e.printStackTrace();
		}
		DatagramPacket paquet = new DatagramPacket (baos.toByteArray (), baos.toByteArray ().length,
				adresseDiffusion,
				portDiffusion) ;
		try {
			socketDiffusion.send (paquet);
		} catch (IOException e) {
			e.printStackTrace () ;
		}
	}

	public int getPortDiffusion () throws RemoteException {
		return (portDiffusion) ;
	}

	public InetAddress getAdresseDiffusion () throws RemoteException {
		return (adresseDiffusion) ;
	}

}